<?php

function insertar_usuario($ep, $user, $password, $email){
    try{
        $dbh=$ep->dbh;
        $SQL= "INSERT INTO usuarios (user, password, email) VALUES ('$user', '$password', '$email');";
        $num_afect=$dbh->exec($SQL);
    }
    catch(PDOException $e) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function insertar_concurso($ep, $id_usuario, $titulo, $descripcion, $fecha_inicio, $fecha_fin, $credito, $array_mercados,$max,$min,$ult){
    try{
        $dbh=$ep->dbh;
        $titulo=utf8_decode($titulo);
        $descripcion=utf8_decode($descripcion);
        $SQL= "INSERT INTO concursos (id_usuario, titulo, descripcion, fecha_inicio, fecha_fin, credito, max, min, ult) VALUES ('$id_usuario', '$titulo', '$descripcion', '$fecha_inicio', '$fecha_fin', '$credito', '$max', '$min', '$ult');";
        $result=$dbh->query($SQL);
        if($result){
            $id_concurso=$dbh->lastInsertId();
            $num_afect2=insertar_mercados_concursos($ep, $array_mercados, $id_concurso);
            $num_afect=1;
        }
    }
    catch(PDOException $e) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function insertar_mercados_concursos($ep, $array_mercados, $id_concurso){
    for ($index = 0; $index < $array_mercados[0]; $index++) {
        if($array_mercados[$index+1]>0){
            try{
                $dbh=$ep->dbh;
                $pos=$index+1;
                $SQL= "INSERT INTO concursos_mercados (id_concurso, id_mercado) VALUES ('$id_concurso', '$pos');";
                $num_afect=$dbh->exec($SQL);
            }
            catch(PDOException $e) {
                $ep->error("Fallo de conexion con la base de datos");
            }
        }
    }

    return $num_afect;
}

function login($ep,$user,$password){
    $count=0;
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM usuarios WHERE user = '$user' AND password='$password'";
        $stmt = $dbh->prepare($SQL);
        $stmt->execute();
        $count=$stmt->rowCount();
        $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    if($count==1){
        $ep->logear($row);
    }
    return $count==1;
}

function get_users($ep){
    try{
    $dbh=$ep->dbh;
    $SQL="SELECT * FROM usuarios";
    $users = $dbh->query($SQL);

    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $users;
}

function get_users_ordenados_por_puntos($ep){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM usuarios ORDER BY puntos DESC";
        $users = $dbh->query($SQL);
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $users;
}

function get_user($ep,$id_usuario){
    try{
    $dbh=$ep->dbh;
    $SQL="SELECT * FROM usuarios WHERE id_usuario = '$id_usuario'";
    $stmt = $dbh->query($SQL);
    $count=$stmt->rowCount();
    $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $row;
}

function get_user_name($ep,$id_usuario){
    try{
    $dbh=$ep->dbh;
    $SQL="SELECT user FROM usuarios WHERE id_usuario = '$id_usuario'";
    $stmt = $dbh->query($SQL);
    $count=$stmt->rowCount();
    $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $row['user'];
}

function user_apuntado_concurso($ep,$id_usuario,$id_concurso){
    try{
        $res=false;
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM `carteras` WHERE id_usuario='$id_usuario' AND id_concurso='$id_concurso'";
        $stmt = $dbh->query($SQL);
        $count=$stmt->rowCount();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    if($count==1){
        $res=true;
    }
    return $res;
}

function edituser($ep,$id_usuario,$user,$password,$email){
    $dbh=$ep->dbh;
    $SQL="UPDATE usuarios SET user='$user' ,password='$password' ,email='$email' WHERE id_usuario='$id_usuario'";
    $count=0;
    try{
        $count = $dbh->exec($SQL);
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
        $ep->fatal_error=true;
        $ep->dbh=null;
    }
    return $count;
}

function fechahora_actual(){
    date_default_timezone_set('Europe/Madrid');
    return date('YmdHis');
}

function fecha_actual(){
    date_default_timezone_set('Europe/Madrid');
    return date('Y/m/d');
}

function delete_user($ep,$id_usuario){
    try {
        $dbh=$ep->dbh;
        $carteras=get_carteras_usuario($ep, $id_usuario);
        $count=$carteras->rowCount();
        for($i=0;$i<$count;$i++){
            $row=$carteras->fetch(PDO::FETCH_ASSOC);
            $id_cartera=$row['id_cartera'];
            $id_concurso=$row['id_concurso'];
            if(concurso_activo($ep, $id_concurso)||  concurso_no_empezado($ep, $id_concurso)){
                delete_componentes_cartera($ep, $id_cartera);
                delete_cartera($ep, $id_cartera);
            }
        }
        $SQL="DELETE FROM usuarios WHERE id_usuario='$id_usuario';";
        $num_afect= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function delete_carteras_usuario($ep,$id_usuario){
    try {
        $dbh=$ep->dbh;
        $SQL="DELETE FROM carteras WHERE id_usuario='$id_usuario';";
        $num_afect= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function delete_cartera($ep, $id_cartera){
    try {
        $dbh=$ep->dbh;
        $SQL="DELETE FROM carteras WHERE id_cartera='$id_cartera';";
        $num_afect= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function delete_componentes_cartera($ep,$id_cartera){
    try {
        $dbh=$ep->dbh;
        $SQL="DELETE FROM componentes WHERE id_cartera='$id_cartera';";
        $num_afect= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function usuario_es_admin($ep,$id_usuario){
    $dbh=$ep->dbh;
    $user = $dbh->query("SELECT * FROM usuarios WHERE id_usuario='$id_usuario'");
    $row=$user->fetch(PDO::FETCH_ASSOC);
    if($row['tipo']==2){
        $res=true;
    }else{
        $res=false;
    }
    return $res;
}

function dinero_suficiente($ep, $id_cartera, $valor_compra){
    $cartera=get_cartera2($ep, $id_cartera);
    $credito_disponible=$cartera['credito_disponible'];
    if($credito_disponible<$valor_compra){
        $res=false;
    }else{
        $res=true;
    }
    return $res;
}

function concurso_activo($ep, $id_concurso){
    $fecha=fecha_actual();
    $concurso=get_concurso($ep, $id_concurso);
    if($concurso['fecha_inicio']<=$fecha && $concurso['fecha_fin']>=$fecha){
        $res=true;
    }else{
        $res=false;
    }
    return $res;
}

function concurso_no_empezado($ep, $id_concurso){
    $fecha=fecha_actual();
    $concurso=get_concurso($ep, $id_concurso);
    if($concurso['fecha_inicio']>$fecha){
        $res=true;
    }else{
        $res=false;
    }
    return $res;
}

function se_debe_actualizar($ep){
    $res=0;
    $dbh=$ep->dbh;
    $actualizacion = $dbh->query("SELECT ultima_actualizacion FROM actualizaciones ORDER BY ultima_actualizacion DESC LIMIT 1");
    $row=$actualizacion->fetch(PDO::FETCH_ASSOC);
    $antigua=$row['ultima_actualizacion'];
    $actual=fechahora_actual();
    $diferencia=$actual-$antigua;
    if($diferencia>500){
        $res=1;
    }
    return $res;
    
}

/**
 *  Funcion que se encarga de actualizar la informacion de los valores
 * la hora por la mañana tiene formato 7:17am
 **/
function actualiza_precios($ep){
   $fp = fopen ( "http://es.old.finance.yahoo.com/d/quotes.csv?s=ABE.MC+ABG.MC+ABI.BR+ACA.PA+ACS.MC+ACX.MC+AGN.AS+AI.PA+ALO.PA+ALV.DE+ANA.MC+BAYN.DE+BBVA.MC+BKT.MC+BME.MC+BN.PA+BNP.PA+BTO.MC+CA.PA+CRI.MC+CS.PA+DAI.DE+DB1.DE+DBK.DE+DG.PA+DTE.DE+EBRO.MC+ELE.MC+ENEL.MI+ENG.MC+ENI.MI+EOAN.DE+FCC.MC+FER.MC+FP.PA+FTE.PA+G.MI+GAM.MC+GAS.MC+GLE.PA+GRF.MC+GSZ.PA+IBE.MC+IBLA.MC+IBR.MC+IDR.MC+INGA.AS+ISP.MI+ITX.MC+MAP.MC+MC.PA+MTS.MC+MUV2.DE+NOK1V.HE+OHL.MC+OR.PA+PHIA.AS+POP.MC+REE.MC+REP.MC+RWE.DE+SAB.MC+SAN.MC+SAN.PA+SAP.DE+SGO.PA+SIE.DE+SU.PA+SYV.MC+TEF.MC+TIT.MI+TL5.MC+TRE.MC+UCG.MI+UL.PA+UNA.AS+VIV.PA+AA+AXP+BA+BAC+CAT+CSCO+CVX+DD+DIS+GE+HD+HPQ+IBM+INTC+JNJ+JPM+KFT+KO+MCD+MMM+MRK+MSFT+PFE+PG+T+TRV+UTX+VZ+WMT+XOM&f=sl1d1t1c1ohgv&e=.csv" , "r" );
    $dbh=$ep->dbh;
    $contador=0;
    while (( $data = fgetcsv ( $fp , 1000 , ";" )) !== FALSE ) { // Mientras hay líneas que leer...
        $i=0;
        foreach($data as $row) {
            $accion[$i]=$row;//almacena los datos de una accion en el array $accion
            $i++ ;
        }
        $ticker=$accion['0'];
        $precio=str_replace(",",".",$accion['1']);
        $fecha=$accion['3'];
        $hora=$accion['2'];
        $diferencia=str_replace(",",".",$accion['4']);
        $minimo_hoy=str_replace(",",".",$accion['7']);
        $maximo_hoy=str_replace(",",".",$accion['6']);
        $apertura=str_replace(",",".",$accion['5']);


        $sql="UPDATE valores SET precio='$precio',hora='$hora',fecha='$fecha',diferencia='$diferencia',apertura='$apertura',maximo_hoy='$maximo_hoy',minimo_hoy='$minimo_hoy' WHERE ticker='$ticker'";
        //echo($sql);
        $contador++;
        $dbh->exec($sql);



    }
    $fechahora=fechahora_actual();
    $sql="INSERT INTO actualizaciones (id_actualizacion , ultima_actualizacion)VALUES (NULL ,'$fechahora')";
    $dbh->exec($sql);
    //actualizar_beneficios_carteras()
    fclose ( $fp );
}

function actualizar_beneficios_carteras($ep){
    $carteras=get_carteras($ep);
    $count = $carteras->rowCount();
    $i=1;
    while($count>0) {
        $cartera=$carteras->fetch(PDO::FETCH_ASSOC);
        $user=get_user($ep, $cartera['id_usuario']);
        $id_concurso=$cartera['id_concurso'];
        $total=$cartera['credito_disponible']+get_total_invertido_usuario_concurso($ep, $cartera['id_usuario'], $id_concurso);
        $concurso=get_concurso($ep, $id_concurso);
        $inicial=$concurso['credito'];
        $beneficios=$total-$inicial;
            $id_cartera=$cartera['id_cartera'];
            try {
                $dbh=$ep->dbh;
                $concursos = $dbh->query("UPDATE carteras SET beneficios='$beneficios' WHERE id_cartera='$id_cartera';");
            }
            catch(PDOException $e ) {
                $ep->error("Error en la conexion con la base de datos.");
            }
        ?>
<!--        <tr>
            <td><?php echo $i;?></td>
            <td><?php echo $user['user'];?></td>
            <td><?php echo $total;?></td>
            <td><?php echo $beneficios;?></td>
        </tr>-->
        <?php
        $i++;
        $count--;
    }
}

function finaliza_concursos($ep){
    $concursos_terminados=get_concursos_recien_terminados($ep);
    $count_concursos=$concursos_terminados->rowCount();
    if($count_concursos>0){
        while($count_concursos>0){ //Hay concursos recien terminados
            $concurso=$concursos_terminados->fetch(PDO::FETCH_ASSOC);
            $id_concurso=$concurso['id_concurso'];
            $carteras=get_carteras_concurso($ep, $id_concurso);
            $count_carteras=$carteras->rowCount();
            while($count_carteras>0){
                $cartera=$carteras->fetch(PDO::FETCH_ASSOC);
                $id_cartera=$cartera['id_cartera'];
                $componentes=get_componentes_cartera($ep,$id_cartera);
                $count_componentes=$componentes->rowCount();
                while($count_componentes>0){
                    $componente=$componentes->fetch(PDO::FETCH_ASSOC);
                    $id_componente=$componente['id_componente'];
                    vender_componente($ep, $id_componente);
                    $count_componentes--;
                }
                $count_carteras--;
            }
            $count_concursos--;
            $carteras=get_carteras_concurso_ordenadas_por_beneficios($ep, $id_concurso);
            $count = $carteras->rowCount();
            $max=$concurso['max'];
            $min=$concurso['min'];
            $ult=$concurso['ult'];
            $cant=$ult-2;
            $gap=floor(($max-$min)/$cant);
            if($count>0){
                $cartera=$carteras->fetch(PDO::FETCH_ASSOC);
                $id_usuario=$cartera['id_usuario'];
                dar_puntos($ep, $id_usuario, $max);
                $fin=false;
                $i=2;
                while($i<($ult) && !$fin){
                    if($i<=$count){
                        $aux=$max-$gap;
                        if($aux<$min){
                            $max=$min;
                        }else{
                            $max=$aux;
                        }
                        $cartera=$carteras->fetch(PDO::FETCH_ASSOC);
                        $id_usuario=$cartera['id_usuario'];
                        dar_puntos($ep, $id_usuario, $max);
                    }else{
                        $fin=true;
                    }
                    $i++;

                }
                if($ult<=$count){
                    $cartera=$carteras->fetch(PDO::FETCH_ASSOC);
                    $id_usuario=$cartera['id_usuario'];
                    dar_puntos($ep, $id_usuario, $min);
                }
            }


//          $beneficios_anterior="a";
//          $puntos=6;
//          while($count>0 && $puntos>0) {
//                $cartera=$carteras->fetch(PDO::FETCH_ASSOC);
//                if($beneficios_anterior!=$cartera['beneficios']){
//                  $puntos--;
//                }
//                $id_usuario=$cartera['id_usuario'];
//                dar_puntos($ep, $id_usuario, $puntos);
//          }
        }
        
    }

}

function dar_puntos($ep, $id_usuario, $puntos){
    $usuario=get_user($ep, $id_usuario);
    $nuevos_puntos=$usuario['puntos']+$puntos;
    try {
        $dbh=$ep->dbh;
        $concursos = $dbh->query("UPDATE usuarios SET puntos='$nuevos_puntos' WHERE id_usuario='$id_usuario';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
}

/**
 *  Funcion que se encarga de actualizar los valores en la base de datos
 **/
function introduce_acciones($ep){
//    $fp = fopen ( "http://download.finance.yahoo.com/d/quotes.csv?s=@%5EIBEX&f=sl1d1t1c1ohgv&e=.csv&h=0" , "r" );
    $fp = fopen ( "http://es.old.finance.yahoo.com/d/quotes.csv?s=ABE.MC+ABG.MC+ABI.BR+ACA.PA+ACS.MC+ACX.MC+AGN.AS+AI.PA+ALO.PA+ALV.DE+ANA.MC+BAYN.DE+BBVA.MC+BKT.MC+BME.MC+BN.PA+BNP.PA+BTO.MC+CA.PA+CRI.MC+CS.PA+DAI.DE+DB1.DE+DBK.DE+DG.PA+DTE.DE+EBRO.MC+ELE.MC+ENEL.MI+ENG.MC+ENI.MI+EOAN.DE+FCC.MC+FER.MC+FP.PA+FTE.PA+G.MI+GAM.MC+GAS.MC+GLE.PA+GRF.MC+GSZ.PA+IBE.MC+IBLA.MC+IBR.MC+IDR.MC+INGA.AS+ISP.MI+ITX.MC+MAP.MC+MC.PA+MTS.MC+MUV2.DE+NOK1V.HE+OHL.MC+OR.PA+PHIA.AS+POP.MC+REE.MC+REP.MC+RWE.DE+SAB.MC+SAN.MC+SAN.PA+SAP.DE+SGO.PA+SIE.DE+SU.PA+SYV.MC+TEF.MC+TIT.MI+TL5.MC+TRE.MC+UCG.MI+UL.PA+UNA.AS+VIV.PA&f=sl1d1t1c1ohgv&e=.csv" , "r" );
    $dbh=$ep->dbh;
    $contador=0;
    while (( $data = fgetcsv ( $fp , 1000 , ";" )) !== FALSE ) { // Mientras hay líneas que leer...
        $i=0;
        foreach($data as $row) {
            $accion[$i]=$row;//almacena los datos de una accion en el array $accion
            $i++ ;
        }
        /*
        $ticker=$accion['0'];
        $precio=str_replace(",",".",$accion['1']);
        $hora=$accion['2'];
        $fecha=$accion['3'];
        $diferencia=str_replace(",",".",$accion['4']);
        $apertura=str_replace(",",".",$accion['5']);
        $maximo_hoy=str_replace(",",".",$accion['6']);
        $minimo_hoy=str_replace(",",".",$accion['7']);
        */
        $ticker=$accion['0'];
        $precio=str_replace(",",".",$accion['1']);
        $fecha=$accion['3'];
        $hora=$accion['2'];
        $diferencia=str_replace(",",".",$accion['4']);
        $minimo_hoy=str_replace(",",".",$accion['7']);
        $maximo_hoy=str_replace(",",".",$accion['6']);
        $apertura=str_replace(",",".",$accion['5']);



        $sql="INSERT INTO valores (ticker,precio,hora,fecha,diferencia,apertura,maximo_hoy,minimo_hoy) VALUES ('$ticker','$precio','$hora','$fecha','$diferencia','$apertura','$maximo_hoy','$minimo_hoy')";
        //echo($sql);
        $contador++;
        $dbh->exec($sql);
        


    }
    echo("Numero de lineas introducidas:  ".$contador);
    fclose ( $fp );
}

function invertir_fecha($fecha){
    $ano_inicio=substr($fecha,0,4);
    $mes_inicio=substr($fecha,5,2);
    $dia_inicio=substr($fecha,8,2);
    $fecha=$dia_inicio."/".$mes_inicio."/".$ano_inicio;
    return $fecha;
}

function borrar_acciones($ep){
    $dbh=$ep->dbh;
    $sql="TRUNCATE valores";
    $dbh->exec($sql);

}


function lista_valores($ep){
     try {

        $dbh=$ep->dbh;
        $valores = $dbh->query("SELECT * FROM valores;");

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $valores;
}

function get_valores_concurso($ep, $id_concurso){
    try {

        $dbh=$ep->dbh;
        $valores = $dbh->query("SELECT valores.id_valor,ticker,fecha,hora,precio,diferencia,apertura,minimo_hoy,maximo_hoy FROM valores,mercados_valores,concursos_mercados WHERE concursos_mercados.id_concurso='$id_concurso' AND valores.id_valor=mercados_valores.id_valor GROUP BY valores.id_valor");

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $valores;
}

function get_valores_mercado($ep, $id_mercado){
    try {

        $dbh=$ep->dbh;
        $valores = $dbh->query("SELECT * FROM valores,mercados_valores WHERE valores.id_valor=mercados_valores.id_valor AND mercados_valores.id_mercado='$id_mercado'");

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $valores;
}

function get_valor($ep, $id_valor){
    try {

        $dbh=$ep->dbh;
        $valor = $dbh->query("SELECT * FROM valores WHERE id_valor='$id_valor'");
        $row=$valor->fetch(PDO::FETCH_ASSOC);

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $row;
}

function lista_concursos($ep){
     try {

        $dbh=$ep->dbh;
        $valores = $dbh->query("SELECT * FROM concursos;");

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $valores;
}

function get_concurso($ep, $id_concurso){
     try {

        $dbh=$ep->dbh;
        $valores = $dbh->query("SELECT * FROM concursos WHERE id_concurso=".$id_concurso.";");
        $row=$valores->fetch(PDO::FETCH_ASSOC);

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $row;
}

function get_concursos_usuario($ep, $id_usuario){
    try {
        $dbh=$ep->dbh;
        $concursos = $dbh->query("SELECT * FROM carteras,concursos WHERE carteras.id_usuario='$id_usuario' AND carteras.id_concurso = concursos.id_concurso;");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $concursos;
}

function get_concursos_activos_usuario($ep, $fecha, $id_usuario){
    try {
        $dbh=$ep->dbh;
        $concursos = $dbh->query("SELECT * FROM carteras,concursos WHERE carteras.id_usuario='$id_usuario' AND carteras.id_concurso = concursos.id_concurso AND concursos.fecha_inicio<='$fecha' AND concursos.fecha_fin>='$fecha';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $concursos;
}

function get_concursos_proximos_usuario($ep, $fecha, $id_usuario){
    try {
        $dbh=$ep->dbh;
        $concursos = $dbh->query("SELECT * FROM carteras,concursos WHERE carteras.id_usuario='$id_usuario' AND carteras.id_concurso = concursos.id_concurso AND concursos.fecha_inicio>'$fecha';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $concursos;
}

function get_concursos_terminados_usuario($ep, $fecha, $id_usuario){
    try {
        $dbh=$ep->dbh;
        $concursos = $dbh->query("SELECT * FROM carteras,concursos WHERE carteras.id_usuario='$id_usuario' AND carteras.id_concurso = concursos.id_concurso AND concursos.fecha_fin<'$fecha';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $concursos;
}

function get_concursos_recien_terminados($ep){
    $dia=date('d')-1;
    if(strlen($dia)==1){
        $dia="0".$dia;
    }
    $ayer=date('Y/m/').$dia;
    try {
        $dbh=$ep->dbh;
        $concursos = $dbh->query("SELECT * FROM concursos WHERE fecha_fin='$ayer';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $concursos;
}

function get_cartera($ep, $id_usuario, $id_concurso){
    try {
        $dbh=$ep->dbh;
        $cartera = $dbh->query("SELECT * FROM carteras WHERE id_usuario='$id_usuario' AND id_concurso = '$id_concurso';");
        $row=$cartera->fetch(PDO::FETCH_ASSOC);
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $row;
}

function get_carteras_usuario($ep, $id_usuario){
    try {
        $dbh=$ep->dbh;
        $carteras = $dbh->query("SELECT * FROM carteras WHERE id_usuario='$id_usuario';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $carteras;
}

function get_cartera2($ep, $id_cartera){
    try {
        $dbh=$ep->dbh;
        $cartera = $dbh->query("SELECT * FROM carteras WHERE id_cartera='$id_cartera';");
        $row=$cartera->fetch(PDO::FETCH_ASSOC);
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $row;
}

function get_carteras_concurso($ep, $id_concurso){
    try {
        $dbh=$ep->dbh;
        $carteras = $dbh->query("SELECT * FROM carteras WHERE id_concurso = '$id_concurso';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $carteras;
}

function get_carteras_concurso_ordenadas_por_beneficios($ep, $id_concurso){
    try {
        $dbh=$ep->dbh;
        $carteras = $dbh->query("SELECT * FROM carteras WHERE id_concurso = '$id_concurso' ORDER BY beneficios DESC;");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $carteras;
}

function get_carteras($ep){
    try {
        $dbh=$ep->dbh;
        $carteras = $dbh->query("SELECT * FROM carteras;");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $carteras;
}

function get_mercados($ep){
    try {
        $dbh=$ep->dbh;
        $mercados = $dbh->query("SELECT * FROM mercados;");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $mercados;
}

function get_mercados_concurso($ep, $id_concurso){
    try {
        $dbh=$ep->dbh;
        $mercados = $dbh->query("SELECT * FROM concursos_mercados WHERE id_concurso='$id_concurso';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $mercados;
}

function get_id_catera($ep, $id_usuario, $id_concurso){
    try {
        $dbh=$ep->dbh;
        $cartera = $dbh->query("SELECT * FROM carteras WHERE id_usuario='$id_usuario' AND id_concurso = '$id_concurso';");
        $row=$cartera->fetch(PDO::FETCH_ASSOC);
        $id_cartera=$row['id_cartera'];
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $id_cartera;
}

function get_precio_actual($ep,$id_valor){
    try {
        $dbh=$ep->dbh;
        $valor = $dbh->query("SELECT * FROM valores WHERE id_valor='$id_valor';");
        $row=$valor->fetch(PDO::FETCH_ASSOC);
        $precio_actual=$row['precio'];
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $precio_actual;
}

function get_fondos_disponibles($ep, $id_usuario, $id_concurso){
    $cartera=get_cartera($ep, $id_usuario, $id_concurso);
    $disponible=$cartera['credito_disponible'];
    return $disponible;
}

function get_total_invertido_usuario_concurso($ep, $id_usuario, $id_concurso){
    $id_cartera=get_id_catera($ep, $id_usuario, $id_concurso);
    try {
        $dbh=$ep->dbh;
        $componentes = $dbh->query("SELECT * FROM componentes WHERE id_cartera='$id_cartera';");
        $count = $componentes->rowCount();
        $res=0;
        while($count>0){
            $row=$componentes->fetch(PDO::FETCH_ASSOC);
            $precio_actual=get_precio_actual($ep,$row['id_valor']);
            $res=$res+($row['cantidad']*$precio_actual);
            $count--;
        }
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $res;
}

function get_credito_concurso($ep, $id_concurso){
    try {

        $dbh=$ep->dbh;
        $valores = $dbh->query("SELECT * FROM concursos WHERE id_concurso=".$id_concurso.";");
        $row=$valores->fetch(PDO::FETCH_ASSOC);
        $credito=$row['credito'];

    }
    catch(PDOException $e ) {

        $ep->error("Error en la conexion con la base de datos.");

    }

    return $credito;
}

function get_componentes($ep, $id_concurso, $id_usuario){
    $id_cartera=get_id_catera($ep, $id_usuario, $id_concurso);
    try {
        $dbh=$ep->dbh;
        $componentes = $dbh->query("SELECT * FROM componentes WHERE id_cartera='$id_cartera';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $componentes;
}

function get_componentes_cartera($ep, $id_cartera){
    try {
        $dbh=$ep->dbh;
        $componentes = $dbh->query("SELECT * FROM componentes WHERE id_cartera='$id_cartera';");
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $componentes;
}

function get_componente($ep, $id_componente){
    try {
        $dbh=$ep->dbh;
        $componentes = $dbh->query("SELECT * FROM componentes WHERE id_componente='$id_componente';");
        $row=$componentes->fetch(PDO::FETCH_ASSOC);
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }

    return $row;
}

function comprar_componente($ep, $id_cartera, $id_valor, $cantidad, $precio){
    try{
        $dbh=$ep->dbh;
        $SQL= "INSERT INTO componentes (id_cartera, id_valor, cantidad, precio_compra) VALUES ('$id_cartera', '$id_valor', '$cantidad', '$precio');";
        $num_afect=$dbh->exec($SQL);
        $total_compra=$cantidad*$precio;
        $cartera=get_cartera2($ep, $id_cartera);
        $disponible=$cartera['credito_disponible'];
        $nuevo_disponible=$disponible - $total_compra;
        $SQL="UPDATE carteras SET credito_disponible='$nuevo_disponible' WHERE id_cartera='$id_cartera'";
        $dbh->exec($SQL);
    }
    catch(PDOException $e) {
        $ep->error("Fallo de conexion con la base de datos");
    }
    return $num_afect;
}

function vender_componente($ep,$id_componente){
    $usuario=$ep->session_vars['user'];
    $id_usuario=get_user_id($ep, $usuario);
    $componente=get_componente($ep, $id_componente);
    $id_cartera=$componente['id_cartera'];
    $cartera=get_cartera2($ep, $id_cartera);
    $credito_disponible=$cartera['credito_disponible'];
    $venta=$componente['cantidad']*get_precio_actual($ep, $componente['id_valor']);
    $nuevo_disp=$credito_disponible+$venta;
    try {
        $dbh=$ep->dbh;
        $dbh->query("UPDATE carteras SET credito_disponible='$nuevo_disp' WHERE id_cartera='$id_cartera';");
        $dbh->query("DELETE FROM componentes WHERE id_componente='$id_componente';");

    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
}

function valor_en_concurso($ep, $id_valor, $id_concurso){
    try {
        $dbh=$ep->dbh;
        $valor=$dbh->query("SELECT * FROM `concursos_mercados`,`mercados_valores`
                WHERE concursos_mercados.id_concurso='$id_concurso' AND
                concursos_mercados.id_mercado=mercados_valores.id_mercado AND
                id_valor='$id_valor';");
        $count = $valor->rowCount();
        if($count==1){
            $res=true;
        }else{
            $res=false;
        }

    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $res;
}

function get_ticker_valor($ep, $id_valor){
    try {
        $dbh=$ep->dbh;
        $valor = $dbh->query("SELECT * FROM valores WHERE id_valor='$id_valor';");
        $row=$valor->fetch(PDO::FETCH_ASSOC);
        $ticker=$row['ticker'];
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $ticker;
}

function get_nombre_ticker($ep,$ticker){
    try {
        $dbh=$ep->dbh;
        $valor = $dbh->query("SELECT nombre FROM nombres_tickers WHERE ticker='$ticker';");
        $row=$valor->fetch(PDO::FETCH_ASSOC);
        $nombre=$row['nombre'];
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $nombre;
}

function get_nombre_mercado($ep,$id_mercado){
    try {
        $dbh=$ep->dbh;
        $mercado = $dbh->query("SELECT titulo FROM mercados WHERE id_mercado='$id_mercado';");
        $row=$mercado->fetch(PDO::FETCH_ASSOC);
        $nombre=$row['titulo'];
    }
    catch(PDOException $e ) {
        $ep->error("Error en la conexion con la base de datos.");
    }
    return $nombre;
}

function puede_crear_concurso($ep, $usuario){
    $id_usuario=get_user_id($ep, $usuario);
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM usuarios WHERE id_usuario = '$id_usuario'";
        $stmt = $dbh->query($SQL);
        $count=$stmt->rowCount();
        $row=$stmt->fetch();
        if($row['tipo']==2){
            $salida=true;
        }else{
            $salida=false;
        }
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $salida;
}

function hora_usa($hora){
    $horas=substr($hora, 0, 2);
    $horas=$horas+6;
    $hora=$horas.substr($hora, 2, 3);
    return $hora;
}

function apuntarse_a_concurso($ep, $id_usuario, $id_concurso, $credito){
    try{
        $dbh=$ep->dbh;
        $SQL="INSERT INTO carteras (id_usuario, id_concurso, credito_disponible) VALUES ('$id_usuario', '$id_concurso', '$credito');";
        $num_afect=$dbh->exec($SQL);
//        $count=$stmt->rowCount();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $num_afect;
}

/*EJEMPLOS DE ABD---------------------------------------------------------*/

/**
 *  Funcion que se encarga de insertar una oferta
 * @param <type> $ep variable de entorno de pagina
 * @param <type> $id_usuario id_de usuario que crea la oferta.
 * @param <type> $titulo titulo de la oferta.
 * @param <type> $descripcion Descripcion de la oferta
 * @param <type> $foto Ruta de la foto.
 * @return <type>
 */
function insertar_oferta($ep, $id_usuario, $titulo, $descripcion, $foto){
    $estado="abierta";
    try {
        $dbh=$ep->dbh;
        $SQL="INSERT INTO oferta (id_usuario, titulo, descripcion, foto, estado)
VALUES ('$id_usuario', '$titulo', '$descripcion', '$foto', '$estado');";
        $num_afect= $dbh->exec($SQL);
    }
    catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
        //no usar en produccion
        //$ep->error("error: ".$e->GetMessage());
    }

    return $num_afect;
}
/**
 *  Funcion que genera un array con las provincias.
 * @param <type> $ep varible de entorno
 * @return <PDOStatement> PDOStatement de la tabla provincias
 */
function mostrar_provincias($ep){
    try {

        $dbh=$ep->dbh;
        $provincias = $dbh->query("SELECT * FROM provincia;");

    }
    catch(PDOException $e ) {

        $ep->error("error: ".$e->GetMessage());

    }

    return $provincias;
}

/**
 *  Funcion que devuelve un PDOStatement con el resultado de listar las ofertas
 * @param <type> $ep
 * @param <type> $by
 * @param <type> $order
 * @return <type>
 */
function lista_ofertas($ep,$by,$order){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM oferta ORDER BY $by $order;";
        $query = $dbh->query($SQL);
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $query;
}
/**
 *  Genera un PDOStatement con el resultado de una oferta respecto de su id
 * Puede que esté obsoleto.
 * @param <type> $ep
 * @param <type> $id_oferta
 * @return <PDOStatement>
 */

/**
 *  Edita un usuario, antes de ejecutar esta instrucción se deberia validar que
 * el nombre de usuario no se la usurpa a nadie.
 * @param <type> $ep
 * @param <type> $id_usuario
 * @param <type> $user
 * @param <type> $nombre
 * @param <type> $apellidos
 * @param <type> $password
 * @param <type> $email
 * @param <type> $id_provincia
 * @param <type> $poblacion
 * @return <type>
 */

/**
 *  Añade una contraoferta, se debe validar que no sea él mismo, y que la oferta este
 * pendiente o abierta.
 * @param <type> $ep
 * @param <type> $id_usuario
 * @param <type> $titulo
 * @param <type> $descripcion
 * @param <type> $foto
 * @param <type> $id_oferta
 * @return <type>
 */
function insertar_contraoferta($ep, $id_usuario, $titulo, $descripcion, $foto, $id_oferta){
    $estado="";
    try {
        $dbh=$ep->dbh;
        $SQL="INSERT INTO contraoferta (id_usuario, titulo, descripcion, foto, estado, id_oferta)
VALUES ('$id_usuario', '$titulo', '$descripcion', '$foto', '$estado', '$id_oferta');";
        $num_afect= $dbh->exec($SQL);
    }
    catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
        //no usar en produccion
        $ep->error("error: ".$e->GetMessage());
    }
    pendent_oferta($ep,$id_oferta);
    return $num_afect;
}
/**
 *Retorna un PDOStatement con la oferta según su id_oferta
 * @param <type> $ep
 * @param <type> $id_oferta
 * @return <type>
 */
function get_oferta($ep,$id_oferta){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM oferta WHERE id_oferta = '$id_oferta';";
        $stmt = $dbh->query($SQL);
        $count=$stmt->rowCount();
        $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $row;
}

/**
 *  Coloca la oferta en estado pendiente, sólo se debe poner cuando hay
 * al menos una oferta.
 * @param <type> $ep
 * @param <type> $id_oferta
 * @return <type>
 */
function pendent_oferta($ep, $id_oferta){
    try {
        $dbh=$ep->dbh;
        $SQL="UPDATE oferta SET estado='pendiente' WHERE id_oferta='$id_oferta';";
        $num_afect= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
        //no usar en produccion
        //$ep->error("error: ".$e->GetMessage());
    }

    return $num_afect;
}
/**
 *  Pone la contraoferta a aceptada, y la oferta tambien.(esto lo hace el ofertante)
 * @param <type> $ep
 * @param <type> $id_contraoferta
 * @return <type>
 */
function acept_contraoferta($ep, $id_contraoferta){
    try {
        $dbh=$ep->dbh;
        //actualizamos contraoferta
        $SQL="UPDATE contraoferta SET estado='aceptada' WHERE id_contraoferta='$id_contraoferta';";
        $num_afect= $dbh->exec($SQL);
        //catualizamos oferta
        $contraoferta=get_contraoferta($ep, $id_contraoferta);
        $id_oferta=$contraoferta['id_oferta'];
        $SQL="UPDATE oferta SET oferta.estado='aceptada' WHERE id_oferta='$id_oferta' ;";
        $num_afect+= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
        //no usar en produccion
        //$ep->error("error: ".$e->GetMessage());
    }

    return $num_afect;
}
/**
 *  Confirma la contraoferta y la oferta.(Esto lo hace el contraofertante)
 * @param <type> $ep
 * @param <type> $id_contraoferta
 * @return <type>
 */
function confirm_contraoferta($ep, $id_contraoferta){
    try {
        $dbh=$ep->dbh;
        //actualizamos contraoferta
        $SQL="UPDATE contraoferta SET estado='confirmada' WHERE id_contraoferta='$id_contraoferta';";
        $num_afect= $dbh->exec($SQL);
        //catualizamos oferta
        $contraoferta=get_contraoferta($ep, $id_contraoferta);
        $id_oferta=$contraoferta['id_oferta'];
        $SQL="UPDATE oferta SET oferta.estado='confirmada' WHERE id_oferta='$id_oferta' ;";
        $num_afect+= $dbh->exec($SQL);
    }catch(PDOException $e ) {
        $ep->error("Fallo de conexion con la base de datos");
        //no usar en produccion
        //$ep->error("error: ".$e->GetMessage());
    }

    return $num_afect;
}
/**
 *  Retorna un PDOStatement con la contraoferta correspondiente a su id_contraoferta.
 * @param <type> $ep
 * @param <type> $id_contraoferta
 * @return <type>
 */
function get_contraoferta($ep,$id_contraoferta){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM contraoferta WHERE id_contraoferta = '$id_contraoferta';";
        $stmt = $dbh->query($SQL);
        $count=$stmt->rowCount();
        $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $row;
}
/**
 *Devuelve un PDOStatement con el listado de contraofertas asociadoas a una oferta.
 * @param <type> $ep
 * @param <type> $id_oferta
 * @return <type>
 */
function ver_contraofertas($ep,$id_oferta){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM contraoferta WHERE id_oferta='$id_oferta';";
        $query = $dbh->query($SQL);
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $query;
}

function getEmail($ep,$id_oferta){
    $email='';
    $contra=getconaconfirm($ep,$id_oferta);
    $id_contraoferta=$contra['id_contraoferta'];
    $id_usuario=$ep->session_vars['id_usuario'];
    $contraoferta=get_contraoferta($ep, $id_contraoferta);
    $id_oferta=$contraoferta['id_oferta'];
    $oferta=get_oferta($ep, $id_oferta);
    if($contraoferta['id_usuario']==$id_usuario){
        //la contra oferta le pertenece, encontremos al ofertante
        $id_usuario_oferta=$oferta['id_usuario'];
        $usuario=get_user($ep, $id_usuario_oferta);
        $email=$usuario['email'];
    }
    if($oferta['id_usuario']==$id_usuario){
        //la oferta le pertenece, busquemos al contraofertante
        $id_usuario_contraofertante=$contraoferta['id_usuario'];
        $usuario=get_user($ep, $id_usuario_contraofertante);
        $email=$usuario['email'];
    }
    return $email;
}
/**
 *Devuelve la contraoferta confirmada
 * @param <type> $ep
 * @param <type> $id_oferta
 * @return <type>
 */
function getconaconfirm($ep,$id_oferta){
    if(is_numeric($id_oferta)){
        try{
            $dbh=$ep->dbh;
            $SQL="SELECT * FROM contraoferta WHERE id_oferta='$id_oferta' AND estado='confirmada';";
            $query = $dbh->query($SQL);
            $row=$query->fetch();
        }catch (PDOException $e){
            $ep->error("Error en la conexion con la base de datos.<br/>");
        }
    }
    return $row;
}

function busca_ofertas($ep,$titulo,$usuario,$estado,$id_provincia){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM oferta,usuario WHERE oferta.id_usuario=usuario.id_usuario ";
        if($titulo!=""){
            $SQL.="AND oferta.titulo LIKE '%$titulo%' ";
        }
        if($usuario!=''){
            $SQL.="AND (usuario.user LIKE '%$usuario%' OR usuario.nombre LIKE '%$usuario%') ";
        }

        if($id_provincia!=''){
            $SQL.="AND usuario.id_provincia='$id_provincia' ";
        }
        //el estado no puede estar vacio
        if($estado!=''){
            $SQL.="AND estado='$estado' ";
        }
        $SQL.=";";
        $query = $dbh->query($SQL);
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $query;
}


function get_user_id($ep,$usuario){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM usuarios WHERE user = '$usuario'";
        $stmt = $dbh->query($SQL);
        $count=$stmt->rowCount();
        $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    return $row['id_usuario'];
}

function puede_crear_concursos($ep, $id_usuario){
    try{
        $dbh=$ep->dbh;
        $SQL="SELECT * FROM usuarios WHERE id_usuario = '$id_usuario'";
        $stmt = $dbh->query($SQL);
        $count=$stmt->rowCount();
        $row=$stmt->fetch();
    }catch (PDOException $e){
        $ep->error("Error en la conexion con la base de datos.<br/>");
    }
    if($row['puntos']>=50 || usuario_es_admin($ep, $id_usuario)){
        $salida=true;
    }else{
        $salida=false;
    }
    return $salida;
}
?>